1.5 getAST——Syntax Tree, Generate!中文版

中文本为初稿,更新版本请参阅英文版

Fasta 解析器中,getAST 方法用于抽象语法树生成。

注:位于 pkg\front_end\lib\src\fasta\util\parser_ast.dart

getAST 方法接收到 Dart 源码的字节流,首先创建 Utf8BytesScanner 进行 tokenize 操作。与第一节相同,不再赘述。

之后,会创建一个 Listener 以及创建一个 Parser,他俩都是第二节中铺垫的东东,在这里对应起来。

核心代码如下:

// tokenize,返回第一个 token
Token firstToken = scanner.tokenize();

// 创建 Listener
ParserASTListener listener = new ParserASTListener();

// 创建 Parser
Parser parser = new Parser(
  listener,
  //...省略其它参数
);

// 触发 Parser 解析,以第一个 token 作为开始
parser.parseUnit(firstToken);

// 返回抽象语法树
return listener.data.single as CompilationUnitEnd;

在上面的代码中,Parser 只负责分析 Token,识别出各种事件,向 Listener 发出通知。

抽象语法树实际上是在 ParserASTListener 中被生成的。ParserASTListener 继承自 Listener,实现了各个通知方法,在各个方法中,ParserASTListener 通过自身的解析规则,一步步构建出 AST。

最终,构建出的 AST 保存在 listener.data 属性中,作为返回值返回。

再回顾一下第四节中的 viewer.dart,它的核心逻辑如下:

// 读取源代码文件
Uint8List bytes = new File.fromUri(uri).readAsBytesSync();

// 构建 AST
ParserAstNode ast = getAST(bytes, 
						   enableExtensionMethods: true);

// 构建 TUI 应用
Widget widget = new QuitOnQWidget(
  new WithSingleLineBottomWidget(
    new BoxedWidget(
      // 专门负责展示 AST 的组件
      new AstWidget(ast),
    ),
    new StatusBarWidget(),
  ),
);
Application app = new Application(widget);
// 运行 TUI 应用
app.start();

本文作者:Maeiee

本文链接:1.5 getAST——Syntax Tree, Generate!中文版

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!